{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpu:  16\n",
      "active []\n"
     ]
    }
   ],
   "source": [
    "# this notebook performs PCA \n",
    "import multiprocessing\n",
    "print \"cpu: \", multiprocessing.cpu_count()\n",
    "print 'active', multiprocessing.active_children()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import twx\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from numpy import linalg as LA\n",
    "%pylab inline\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  1\n",
      "Aligning by time interval: 1 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(2.256428322968869, array([0.15988328, 0.28468534, 0.35356584, 0.22083935, 0.31313216,\n",
      "       0.25623365, 0.11138879, 0.23825971, 0.28508223, 0.34774583,\n",
      "       0.27529313, 0.34384984, 0.30085234])), (1.297157444123453, array([-0.01070767, -0.35588322,  0.14596745,  0.01740269,  0.34480685,\n",
      "        0.46384022, -0.5948147 , -0.32044937, -0.1967961 ,  0.01669318,\n",
      "       -0.10078378,  0.10833346,  0.01379886])), (0.9743365272484568, array([-0.92035925,  0.14105019,  0.1041209 , -0.23745856, -0.03108281,\n",
      "        0.06351099, -0.04071599,  0.08667511,  0.05558163, -0.00936134,\n",
      "       -0.03881527,  0.18124736,  0.11879236])), (0.9474604584840937, array([-0.30889795, -0.00940604, -0.02475665,  0.87506771,  0.0880953 ,\n",
      "       -0.02625938,  0.10379573, -0.19197816,  0.08739618, -0.06378942,\n",
      "       -0.01541632, -0.15277884, -0.21626711])), (0.9117300301173529, array([ 0.08897348,  0.02347723,  0.11348053, -0.00674041,  0.14571168,\n",
      "        0.0025654 , -0.20710704,  0.42464896,  0.50031778, -0.26813383,\n",
      "       -0.57421161,  0.03060882, -0.28509863])), (0.8962443430586131, array([-0.02832551,  0.1102917 , -0.08094508, -0.20756301,  0.11707027,\n",
      "        0.14611217, -0.13178247, -0.08372686,  0.34959717, -0.22519993,\n",
      "        0.65784767, -0.12108788, -0.50755183])), (0.8677012936107539, array([-0.05811994, -0.23135219, -0.24321291,  0.1769833 ,  0.00299952,\n",
      "        0.13358778, -0.09507826,  0.74540728, -0.43003108, -0.04912148,\n",
      "        0.23670154,  0.09812213, -0.13077009])), (0.8579697846652904, array([ 0.00627155,  0.32570956,  0.00355158, -0.10429337,  0.14038509,\n",
      "        0.03771394,  0.15065643, -0.0919614 , -0.33055579,  0.44355503,\n",
      "       -0.23188438,  0.22736134, -0.64747812]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  5\n",
      "Aligning by time interval: 5 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(3.447990380725102, array([0.16025434, 0.310788  , 0.33214006, 0.20364003, 0.29702959,\n",
      "       0.27238908, 0.20243314, 0.26766514, 0.30037535, 0.30371349,\n",
      "       0.26378114, 0.33461147, 0.2947615 ])), (1.081177467865373, array([-0.21366524,  0.25438776, -0.11977953, -0.38358739, -0.2235728 ,\n",
      "       -0.21561271,  0.56768626,  0.32219612,  0.34224849, -0.27870389,\n",
      "       -0.03573472,  0.0424472 , -0.08779133])), (0.9780023331886211, array([ 0.80617974, -0.02026776, -0.04335018, -0.36392822, -0.06973477,\n",
      "       -0.14417585,  0.01996267, -0.07440608, -0.04072045, -0.09580819,\n",
      "        0.41166093, -0.05033618, -0.03033566])), (0.8687035295524623, array([ 0.16388789,  0.01982706, -0.06485991,  0.6187627 ,  0.22383199,\n",
      "       -0.00555512,  0.35733275, -0.14781834,  0.0976872 , -0.30538571,\n",
      "        0.09602054, -0.1441311 , -0.50319781])), (0.8559702611345259, array([-0.28959273,  0.01279896,  0.12381213, -0.33804226,  0.33961839,\n",
      "        0.14695842,  0.39262573, -0.61501182, -0.21110107,  0.01875149,\n",
      "        0.24384035, -0.06041554,  0.0949466 ])), (0.8082941891366785, array([-0.32503754, -0.28942776,  0.00650104, -0.04094363,  0.26071388,\n",
      "       -0.43017249, -0.28417267,  0.13240081,  0.14097502, -0.04482526,\n",
      "        0.54284836,  0.30582344, -0.21786183])), (0.7943686144669492, array([ 0.01146409, -0.13995985,  0.13149179, -0.34270181,  0.26793875,\n",
      "        0.63347477, -0.21891561,  0.23107878,  0.08687856, -0.37572755,\n",
      "       -0.09843325,  0.0317089 , -0.33425837]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  10\n",
      "Aligning by time interval: 10 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(4.249506080811331, array([-0.17292226, -0.32147773, -0.32055017, -0.1947695 , -0.30609812,\n",
      "       -0.28236347, -0.21701743, -0.2848358 , -0.32176105, -0.28627097,\n",
      "       -0.25970975, -0.3118097 , -0.27249497])), (1.0713715576103013, array([-0.09891813,  0.12089969, -0.20824654, -0.40030097, -0.16788145,\n",
      "       -0.08335065,  0.68647323,  0.1814413 ,  0.29748274, -0.35349173,\n",
      "        0.07392833,  0.04264407, -0.10934683])), (0.9798994413077161, array([ 0.78066179, -0.02688735,  0.04053909, -0.36707989, -0.02776054,\n",
      "       -0.04040435,  0.00644253, -0.18389923, -0.17348739,  0.05166414,\n",
      "        0.40293375, -0.12717046, -0.0767763 ])), (0.8425650129732791, array([-0.33556901, -0.15760387,  0.08962064, -0.72198153,  0.08907635,\n",
      "        0.3196605 , -0.25465042, -0.01178159, -0.07067019,  0.06131274,\n",
      "        0.08837333,  0.16673955,  0.33733775])), (0.7943137892854115, array([-0.29100481,  0.39833553, -0.03754627,  0.04153016,  0.19894354,\n",
      "       -0.23018645,  0.09774728, -0.58998295,  0.03948621,  0.00733482,\n",
      "        0.32098945, -0.32961737,  0.30002832])), (0.7727283984854136, array([-0.02474929, -0.10333339, -0.09774697,  0.12410239, -0.60128949,\n",
      "       -0.25014689,  0.1413429 ,  0.2063851 , -0.25031958,  0.2732541 ,\n",
      "        0.16947165,  0.05435835,  0.55502748]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  20\n",
      "Aligning by time interval: 20 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(5.035166203046435, array([0.19200916, 0.3063888 , 0.30428137, 0.22427399, 0.32380421,\n",
      "       0.28734528, 0.23823133, 0.29516914, 0.32186984, 0.27696854,\n",
      "       0.26224021, 0.27459531, 0.2656928 ])), (1.0071968375708698, array([-0.68446883, -0.16370651,  0.20246276, -0.16300142,  0.09812663,\n",
      "        0.17133733, -0.39811623,  0.06520483,  0.1245916 ,  0.11625773,\n",
      "       -0.24919896,  0.30145997,  0.23106556])), (0.8898832852864395, array([-0.39223556,  0.32452449, -0.25825441,  0.37948248,  0.09475497,\n",
      "        0.05404129,  0.39766063, -0.006614  ,  0.24293591, -0.36425339,\n",
      "       -0.37740491, -0.02014384, -0.15974201])), (0.8531800840515724, array([-1.58997097e-04, -5.08331081e-02, -1.10030541e-01, -6.67295208e-01,\n",
      "       -2.79948227e-01,  2.53129528e-01,  4.36966351e-01,  3.30082866e-01,\n",
      "        4.62026728e-02, -1.99726109e-01,  8.00102299e-03,  2.32532894e-01,\n",
      "       -3.90605735e-02])), (0.7337213514810175, array([ 0.0639643 , -0.11912051,  0.21325896,  0.04183476,  0.19197508,\n",
      "        0.24467725, -0.23159108, -0.07375307,  0.10933089, -0.29971498,\n",
      "        0.22393203,  0.28895661, -0.73706867]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  30\n",
      "Aligning by time interval: 30 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(5.435387511178339, array([0.20616074, 0.29121571, 0.28953237, 0.25233613, 0.31817724,\n",
      "       0.28766794, 0.24683757, 0.30186135, 0.31492926, 0.29388122,\n",
      "       0.27183746, 0.27004335, 0.23829469])), (0.995608268294771, array([-0.72054329,  0.1859515 ,  0.12216432,  0.18628277,  0.23562697,\n",
      "        0.21578603,  0.04891826, -0.08852757,  0.17089965, -0.24298815,\n",
      "       -0.43651692,  0.04161161,  0.06141444])), (0.8892180153394246, array([-0.19446221, -0.44304105,  0.2152063 , -0.41153367,  0.00868428,\n",
      "        0.19331209, -0.46005082,  0.138829  , -0.02171554,  0.23109728,\n",
      "       -0.01871574,  0.2828025 ,  0.38425914])), (0.7960567760218009, array([-0.01553727,  0.07924413, -0.09052238, -0.31869256, -0.30939147,\n",
      "       -0.16404292,  0.63105858,  0.16141727, -0.14364652, -0.06795065,\n",
      "       -0.24750539,  0.18304137,  0.4655979 ])), (0.775258590091101, array([-0.10696823,  0.08441533,  0.25480741,  0.40984069, -0.06548727,\n",
      "       -0.20317124, -0.08538238, -0.32267768, -0.41424164,  0.23027185,\n",
      "        0.13334342, -0.28949184,  0.51512156]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  60\n",
      "Aligning by time interval: 60 seconds\n",
      "getting data from: AAPL\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(6.116380915951728, array([0.22763177, 0.30663247, 0.30530572, 0.2691741 , 0.30743995,\n",
      "       0.28633982, 0.23905371, 0.29964278, 0.32429769, 0.26814013,\n",
      "       0.25585568, 0.256952  , 0.23769132])), (1.066693301644023, array([-0.5603054 , -0.1528235 ,  0.21572266,  0.18697873,  0.2641163 ,\n",
      "        0.37424537, -0.39379904,  0.06956893,  0.23475514, -0.27700446,\n",
      "       -0.25717934,  0.09252769, -0.07019236])), (0.8670869800143008, array([-0.12558498, -0.37802121,  0.10522656, -0.38215725, -0.28666486,\n",
      "        0.147343  ,  0.04229291,  0.34561985, -0.16189649,  0.2388796 ,\n",
      "       -0.20221251,  0.24583472,  0.52391275])), (0.8228015256239406, array([ 0.22220773, -0.21150751,  0.04290408, -0.4302466 ,  0.25436533,\n",
      "       -0.03787487, -0.48235196, -0.15429634,  0.13814386,  0.32899089,\n",
      "        0.24521232,  0.34124   , -0.30403264]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  120\n",
      "Aligning by time interval: 120 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "dataframe is empty\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  1\n",
      "Aligning by time interval: 1 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(2.2101335795392174, array([-0.15699305, -0.29344519, -0.36592187, -0.22156606, -0.10330348,\n",
      "       -0.24832694, -0.18958321, -0.27582297, -0.35544857, -0.32510413,\n",
      "       -0.23331124, -0.34682205, -0.33932099])), (1.009774830690711, array([-0.06811648,  0.21939827,  0.00679042,  0.28711166,  0.7756354 ,\n",
      "       -0.15976881,  0.10407433,  0.11918071,  0.11868111, -0.26933292,\n",
      "        0.00079712, -0.30361994, -0.18374533])), (1.0051799834903226, array([-0.63493762, -0.1388885 , -0.09378066, -0.27974002,  0.26433442,\n",
      "        0.17281211,  0.32728866, -0.08583702, -0.24593277,  0.23371055,\n",
      "        0.3821536 ,  0.12040017,  0.02551887])), (0.9806650503862309, array([-0.42007847,  0.23921291,  0.09385179,  0.44655407, -0.44561761,\n",
      "        0.08308056,  0.46534048, -0.1119557 ,  0.05625486, -0.24914967,\n",
      "       -0.19910807, -0.05765477, -0.12381854])), (0.9613271679815145, array([-0.38095635, -0.26385627, -0.0427484 ,  0.24452644, -0.02195384,\n",
      "        0.47201168, -0.54180823,  0.41895321,  0.12746416, -0.08004618,\n",
      "       -0.05236146, -0.04058407, -0.06506364])), (0.9462151140785787, array([ 0.01669581, -0.12230762, -0.1314644 ,  0.48258651, -0.14547217,\n",
      "       -0.25479811, -0.20857066, -0.2444304 , -0.02786734, -0.07358249,\n",
      "        0.69326829, -0.11590332,  0.21215992])), (0.9223085050540624, array([-0.43243346,  0.50295096,  0.17430329, -0.19883978, -0.00396855,\n",
      "       -0.32845235, -0.49553617, -0.24431787,  0.1825548 ,  0.02026864,\n",
      "       -0.07340642,  0.17503274,  0.08495108])), (0.8926901667256962, array([-0.17504371, -0.19278569, -0.09034441, -0.00799603, -0.14957328,\n",
      "       -0.66496699,  0.13997198,  0.6305297 ,  0.10293222,  0.10318293,\n",
      "        0.00125107,  0.13473328, -0.05345852]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  5\n",
      "Aligning by time interval: 5 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(3.6017072795804705, array([0.17780004, 0.28897264, 0.34621485, 0.21735155, 0.34582031,\n",
      "       0.24958399, 0.2112472 , 0.25768107, 0.33977723, 0.29552172,\n",
      "       0.22165938, 0.32206715, 0.26310643])), (1.027863414277388, array([ 0.06389672,  0.35317641,  0.12959347,  0.25433309,  0.1316548 ,\n",
      "       -0.17465773,  0.61427413, -0.27890686,  0.05375421, -0.25299554,\n",
      "       -0.13808816, -0.35402996, -0.27466704])), (0.9624400548641181, array([ 0.09819116, -0.12441115, -0.120859  ,  0.32825547, -0.2360682 ,\n",
      "       -0.42539552,  0.17051835, -0.27115252, -0.23363359,  0.25106612,\n",
      "        0.51465415,  0.0210632 ,  0.36097184])), (0.9273792721909182, array([-0.93512159,  0.07175284,  0.04306319,  0.26989032, -0.08862174,\n",
      "        0.01608806,  0.03745592,  0.10658008,  0.10234856, -0.04876875,\n",
      "        0.09648773,  0.04076901,  0.03167667])), (0.855438123809678, array([-0.16935711,  0.2565463 ,  0.00839905, -0.3778529 ,  0.05462229,\n",
      "       -0.32163974, -0.00478751, -0.41055501,  0.19347067,  0.31838043,\n",
      "       -0.44440972,  0.14679307,  0.36027706])), (0.847913700775792, array([-0.15732388,  0.058836  , -0.10435032, -0.70709208,  0.07545415,\n",
      "        0.10682403,  0.36644576,  0.00443901, -0.0365411 ,  0.09107815,\n",
      "        0.5222682 , -0.06522145, -0.15120856])), (0.7867677335475061, array([-0.04360143, -0.26447523, -0.14022042,  0.12383397, -0.01485845,\n",
      "        0.71643949,  0.16966222, -0.56535002, -0.01299442,  0.08297722,\n",
      "       -0.07737077,  0.01132197,  0.13444117]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  10\n",
      "Aligning by time interval: 10 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(4.154985043925225, array([0.16264197, 0.28953898, 0.34532986, 0.23566405, 0.33999836,\n",
      "       0.26860855, 0.22841794, 0.25206966, 0.34031853, 0.30450857,\n",
      "       0.21126921, 0.31449987, 0.24366818])), (1.0813441442927507, array([ 0.43837377, -0.15267045, -0.0856009 ,  0.14281105, -0.19053858,\n",
      "       -0.24697012,  0.22841632, -0.36257825, -0.32289192,  0.16157357,\n",
      "        0.45449784,  0.04327053,  0.37021025])), (1.018900902370843, array([-0.16302199,  0.3544118 ,  0.05390368,  0.2668573 ,  0.11482076,\n",
      "       -0.14616326,  0.62510907, -0.33732762,  0.07588284, -0.16258075,\n",
      "       -0.07683187, -0.37895316, -0.22999904])), (0.906218637215639, array([-7.46099749e-01, -7.15063048e-02, -3.18634551e-04,  4.83025210e-01,\n",
      "       -1.89179593e-01, -7.54267513e-02, -1.33079690e-01, -8.57527879e-02,\n",
      "       -3.10314192e-02,  6.16388970e-02,  1.29572316e-01,  1.92385645e-01,\n",
      "        2.82494558e-01])), (0.8424363781307125, array([ 0.28809518, -0.12241005,  0.1209128 ,  0.3976704 , -0.20374939,\n",
      "        0.37667944,  0.01836881, -0.08545545, -0.06609507, -0.31688276,\n",
      "       -0.57502189,  0.0028957 ,  0.32058108])), (0.8163046282298051, array([-0.08512297, -0.10004811,  0.09254918, -0.32289335,  0.16598125,\n",
      "       -0.30561923,  0.03621183, -0.4320363 ,  0.24695557,  0.38252185,\n",
      "       -0.4987939 ,  0.15528437,  0.2842197 ]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  20\n",
      "Aligning by time interval: 20 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(4.820571081125465, array([-0.16392088, -0.2898542 , -0.34345192, -0.23926919, -0.34035325,\n",
      "       -0.2848015 , -0.22241655, -0.28814134, -0.32000707, -0.30380231,\n",
      "       -0.22112526, -0.30528636, -0.21831682])), (1.3375220086731507, array([ 0.42334291, -0.20105628,  0.02869108,  0.14985676, -0.26339743,\n",
      "       -0.08303387,  0.20399801, -0.3675233 , -0.37913819,  0.09721331,\n",
      "        0.39061596,  0.08890702,  0.4363875 ])), (0.9773365598822146, array([-0.09549785,  0.26610471,  0.08513026,  0.4986281 ,  0.07875832,\n",
      "       -0.20371389,  0.58233171, -0.25651551,  0.01582122, -0.3258733 ,\n",
      "       -0.18929129, -0.22303911, -0.13984741])), (0.8884881490101025, array([-0.62828895, -0.17484135,  0.0460039 ,  0.37753242, -0.03904407,\n",
      "       -0.24297708, -0.24305506, -0.15817713,  0.075049  ,  0.10534215,\n",
      "       -0.0790129 ,  0.38174852,  0.34157585])), (0.7636457668209501, array([-0.39044526,  0.09948672, -0.05858427, -0.26592387,  0.16601952,\n",
      "       -0.2476278 ,  0.22171023, -0.16341357, -0.0433252 ,  0.2922011 ,\n",
      "        0.63331874, -0.04005228, -0.32986433]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  30\n",
      "Aligning by time interval: 30 seconds\n",
      "getting data from: AAPL\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(5.003558040459268, array([0.19193009, 0.28605628, 0.34511514, 0.23143899, 0.32767082,\n",
      "       0.29406792, 0.22238277, 0.27174124, 0.32171696, 0.29549668,\n",
      "       0.22271687, 0.31594101, 0.22645765])), (1.414575397890859, array([-0.27548172,  0.13350283,  0.04802189, -0.15064284,  0.20901857,\n",
      "        0.13469953, -0.40201605,  0.45111104,  0.3230148 , -0.18156325,\n",
      "       -0.38250614,  0.06067138, -0.40870638])), (1.0597320240212595, array([ 0.23380591, -0.32870282, -0.13682765, -0.49125581, -0.12983833,\n",
      "        0.27134627, -0.4019297 ,  0.22463519, -0.15900181,  0.27463011,\n",
      "        0.30629621,  0.27375136,  0.0726601 ])), (0.8255048110863138, array([ 0.77101592,  0.12894863,  0.01261837, -0.20599351,  0.06859964,\n",
      "        0.13100768,  0.12034944,  0.14127534, -0.07052728, -0.23465257,\n",
      "       -0.33751301, -0.33937047,  0.02965212])), (0.7170151406700758, array([ 0.37192566, -0.25631596, -0.05547995,  0.41358309,  0.00893868,\n",
      "       -0.04028251, -0.03006282, -0.05037593,  0.10151392, -0.12464308,\n",
      "        0.3300285 ,  0.12632948, -0.68262832]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  60\n",
      "Aligning by time interval: 60 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(5.41838759842873, array([-0.20086839, -0.27542233, -0.32551751, -0.27769068, -0.30193781,\n",
      "       -0.2959661 , -0.23981785, -0.28442783, -0.28949117, -0.29586959,\n",
      "       -0.2337921 , -0.30708415, -0.25148188])), (1.4643994593113931, array([ 0.35385219, -0.21455135, -0.12111343, -0.09014435, -0.33006502,\n",
      "        0.26562888,  0.19288591, -0.28102556, -0.42420032,  0.09176314,\n",
      "        0.4995684 ,  0.06683856,  0.26053323])), (0.9979862360629346, array([ 0.04584733,  0.39147686,  0.07310433,  0.2802749 , -0.00331552,\n",
      "        0.00487936,  0.52819458, -0.17014351, -0.20309762, -0.36844481,\n",
      "       -0.26528655, -0.39779718,  0.21714681])), (0.7724570948950266, array([ 0.72142465,  0.06226788,  0.00896502,  0.09125651,  0.11052643,\n",
      "       -0.10133257,  0.03542878, -0.1414621 ,  0.05601196, -0.1222997 ,\n",
      "       -0.04558693,  0.08745722, -0.62903773]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  120\n",
      "Aligning by time interval: 120 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "dataframe is empty\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  1\n",
      "Aligning by time interval: 1 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(2.1326596921813987, array([-0.09881265, -0.23779602, -0.3388278 , -0.25954614, -0.34911352,\n",
      "       -0.27107403, -0.2254443 , -0.24267779, -0.35952492, -0.23833617,\n",
      "       -0.24360535, -0.29206465, -0.34019699])), (1.0467684645320539, array([-0.7352396 ,  0.15025352,  0.30822544,  0.19570165,  0.19380031,\n",
      "       -0.1940124 ,  0.07456383, -0.01192525, -0.11337018, -0.44705529,\n",
      "       -0.08739265,  0.02640044,  0.03996885])), (1.0077019792599031, array([ 0.12656185,  0.02141076,  0.26374257, -0.44374143, -0.28285835,\n",
      "       -0.37047595, -0.0517278 ,  0.63193307, -0.02077873, -0.17849362,\n",
      "        0.04655719,  0.07906458,  0.23889354])), (0.9782336600041951, array([-0.31109239, -0.57080416, -0.02226315, -0.01311344,  0.06543996,\n",
      "        0.2988528 , -0.53553066,  0.17376923, -0.00609822,  0.043147  ,\n",
      "        0.38267339,  0.02033126,  0.13191349])), (0.9482444682275251, array([-0.29910539, -0.15266   ,  0.02887922, -0.17970984, -0.21536377,\n",
      "       -0.33092854,  0.35025744, -0.26656524, -0.12560512,  0.47705862,\n",
      "        0.36482562,  0.35694457, -0.02449407])), (0.9302372425399669, array([ 0.20134933,  0.41033208,  0.16348541,  0.34885738, -0.18797959,\n",
      "       -0.27535561, -0.49022503, -0.16731454, -0.10715106, -0.04497553,\n",
      "        0.48201752,  0.01477898, -0.13085048])), (0.9149820869547513, array([ 0.09518963, -0.10169646,  0.06703544,  0.03061027,  0.0170063 ,\n",
      "       -0.14930741, -0.39638767, -0.25555766,  0.06224037,  0.0241495 ,\n",
      "       -0.50964354,  0.64254071,  0.23043228])), (0.8988639576105667, array([ 0.33839279, -0.55110195,  0.12070865,  0.53533395, -0.0796097 ,\n",
      "       -0.16352888,  0.32443285,  0.0542783 , -0.22200962, -0.28182112,\n",
      "        0.05804944,  0.07243645,  0.04487258]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  5\n",
      "Aligning by time interval: 5 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(3.169781080555036, array([-0.10697878, -0.25380731, -0.36309611, -0.25219036, -0.32105444,\n",
      "       -0.2573622 , -0.2439752 , -0.25068445, -0.35802207, -0.22871369,\n",
      "       -0.24530491, -0.30177824, -0.32447869])), (1.1453689187622393, array([-0.49365698,  0.16830102, -0.11689111,  0.36143361,  0.30630373,\n",
      "       -0.13629978,  0.27599318, -0.476021  , -0.05366355, -0.24339076,\n",
      "       -0.12259953,  0.28640027, -0.09662986])), (1.0069298523645327, array([-0.47119802,  0.11740145,  0.28499384, -0.21545427,  0.04622955,\n",
      "        0.11470949,  0.11856598,  0.4481252 ,  0.13537137, -0.29536392,\n",
      "       -0.47160196, -0.27958573,  0.01535972])), (0.9349095278366265, array([-0.34289543, -0.02194829, -0.13846051, -0.33347647, -0.2841086 ,\n",
      "       -0.40440756,  0.46555589,  0.12631754,  0.07835882,  0.4701826 ,\n",
      "        0.15742499,  0.14849722,  0.0235734 ])), (0.9019073525046508, array([ 0.48856097,  0.57293173,  0.03723439,  0.08643329, -0.02461648,\n",
      "       -0.36324294,  0.31087577, -0.03235215,  0.06169987, -0.00589759,\n",
      "       -0.23421719, -0.26728584, -0.25262111])), (0.8759316502714153, array([ 0.30334367, -0.41394051,  0.1612095 , -0.24290125,  0.12780612,\n",
      "       -0.41457671,  0.2099216 , -0.06332139,  0.17540586, -0.48658833,\n",
      "       -0.04882968,  0.2040668 ,  0.3221776 ])), (0.8364570696410013, array([ 0.09098159,  0.19236596, -0.07742856, -0.36823617,  0.18055883,\n",
      "        0.0503781 , -0.2543362 , -0.24215035, -0.03971947,  0.3533742 ,\n",
      "       -0.58492612,  0.29805791,  0.31182276]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  10\n",
      "Aligning by time interval: 10 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(3.6355299298101347, array([-0.12254863, -0.27817537, -0.34955598, -0.28662042, -0.31863294,\n",
      "       -0.25490949, -0.24456029, -0.23473013, -0.34933763, -0.23740242,\n",
      "       -0.2603491 , -0.28074344, -0.31120839])), (1.1970297351939008, array([ 0.15649504, -0.12032194,  0.29885619, -0.37087341, -0.17953536,\n",
      "        0.20857853, -0.10899541,  0.64940643,  0.1359699 , -0.11134223,\n",
      "       -0.09918517, -0.42495691,  0.05926364])), (1.087435147562427, array([-0.5808113 ,  0.32150101,  0.16655708,  0.07380166,  0.16562526,\n",
      "       -0.10509953,  0.36050702,  0.05150917,  0.1451625 , -0.4071189 ,\n",
      "       -0.35218978, -0.16950697, -0.12418951])), (0.9316836486203484, array([ 0.66684961,  0.29185468,  0.08511701,  0.048512  , -0.02587734,\n",
      "       -0.32780014,  0.35431539, -0.10189166,  0.07428344, -0.0319618 ,\n",
      "       -0.03146238, -0.23156234, -0.39413154])), (0.8750739994968738, array([-0.00304598, -0.23220087, -0.01253681, -0.14983464, -0.36279727,\n",
      "       -0.30704624,  0.44744252,  0.05084177,  0.02484892, -0.40957579,\n",
      "        0.39685419,  0.22286761,  0.34531714])), (0.7972855186589957, array([-0.19028397,  0.33058825, -0.2215692 , -0.07311997, -0.2920283 ,\n",
      "        0.50961378,  0.2770064 , -0.05847573, -0.2018374 ,  0.12835518,\n",
      "        0.4511238 , -0.27372679, -0.19817383]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  20\n",
      "Aligning by time interval: 20 seconds\n",
      "getting data from: AAPL\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(4.297194266985981, array([0.10311074, 0.29071126, 0.32719654, 0.29717276, 0.30074997,\n",
      "       0.27911956, 0.26101861, 0.26029811, 0.34895519, 0.2385298 ,\n",
      "       0.27069715, 0.26822396, 0.28522726])), (1.223388934337593, array([ 0.51575062, -0.24809665,  0.10395464, -0.16407354, -0.29601246,\n",
      "        0.16283362, -0.41328688,  0.37726923,  0.0156509 ,  0.39052541,\n",
      "        0.12308124, -0.19694699,  0.02746299])), (1.0238119387613929, array([-0.32882099,  0.29384663,  0.28121583, -0.20871998,  0.02292389,\n",
      "        0.19749775, -0.0304999 ,  0.44805089,  0.17538739, -0.22033983,\n",
      "       -0.30447458, -0.493577  , -0.16137047])), (0.9041926088145746, array([ 0.63029084,  0.25474138,  0.02664628,  0.11742656,  0.23603273,\n",
      "       -0.26235301,  0.17312548, -0.13769983,  0.16238348, -0.08040569,\n",
      "       -0.08135463, -0.22150673, -0.51122379])), (0.8114346775166782, array([ 0.13052453, -0.20679486,  0.34416165, -0.00678167,  0.25178154,\n",
      "        0.11365168, -0.36600745, -0.22932865,  0.17421829, -0.07216666,\n",
      "       -0.64201758,  0.31755271,  0.10127157])), (0.7783353140925992, array([-0.05557696, -0.21885569,  0.30818307,  0.31724806, -0.45164229,\n",
      "       -0.57061782,  0.22168485,  0.31198132,  0.14296302, -0.06015517,\n",
      "       -0.17362247,  0.1520373 ,  0.00333288]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  30\n",
      "Aligning by time interval: 30 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(4.512027273315487, array([0.07757143, 0.31775659, 0.32970765, 0.29036517, 0.30840402,\n",
      "       0.28699649, 0.26619042, 0.2381717 , 0.3373633 , 0.23325765,\n",
      "       0.22793935, 0.27814244, 0.31207137])), (1.3882183064162357, array([-0.5833374 ,  0.22891081, -0.03029879,  0.19803848,  0.22506042,\n",
      "       -0.02115711,  0.36685916, -0.350383  ,  0.0088271 , -0.40645083,\n",
      "       -0.23905474,  0.13189164, -0.13749032])), (1.0682094430213283, array([-0.33228242,  0.00623109,  0.41335161, -0.17839295, -0.30609128,\n",
      "       -0.13451766,  0.06000136,  0.56147178,  0.09458178, -0.08165706,\n",
      "       -0.43255005, -0.15875916,  0.16825803])), (0.9497010039728611, array([-0.40638984, -0.22705672, -0.12618917, -0.21709183, -0.19394568,\n",
      "        0.29647717, -0.18246638, -0.04860338, -0.24746779,  0.00949658,\n",
      "        0.17594739,  0.50031872,  0.46525613])), (0.7471997924929541, array([-0.15746999,  0.30696657, -0.10162967, -0.43318935,  0.07265402,\n",
      "       -0.29904221,  0.25217532,  0.11516166, -0.09369507, -0.13137493,\n",
      "        0.60884103, -0.29920527,  0.15869577]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  60\n",
      "Aligning by time interval: 60 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "[(4.810366252388185, array([0.05538328, 0.29347463, 0.32664834, 0.2872861 , 0.29960184,\n",
      "       0.29329658, 0.27441429, 0.268705  , 0.33613716, 0.18719918,\n",
      "       0.23425907, 0.32685361, 0.29755814])), (1.4647232239423507, array([-0.66560725,  0.21355769,  0.11768404,  0.07804322,  0.10336351,\n",
      "        0.02453006,  0.31393173, -0.13732217,  0.00121008, -0.43040196,\n",
      "       -0.42110873,  0.01155032,  0.00320763])), (1.1063657826134101, array([ 0.05063601, -0.36023937,  0.36381654,  0.1895783 , -0.48659041,\n",
      "        0.00369049, -0.22876646,  0.39295728, -0.01922279, -0.26298144,\n",
      "       -0.26607888,  0.27213395,  0.20357852])), (0.9432365313585438, array([-0.29603696, -0.05577871, -0.12582527, -0.35575689, -0.07389132,\n",
      "        0.24477374, -0.13317342, -0.22244281, -0.37384904,  0.0613991 ,\n",
      "        0.25765739,  0.34053047,  0.5553238 ])), (0.8317740364515852, array([-0.15387162, -0.17651691,  0.09045863,  0.49494666, -0.12290679,\n",
      "        0.24638472, -0.08672481, -0.43141257, -0.09895669,  0.57551152,\n",
      "       -0.25734478,  0.04109247, -0.11679029]))]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  120\n",
      "Aligning by time interval: 120 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "dataframe is empty\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\"\"\"\n",
    "this cell runs pca for our universe of stocks\n",
    "run the function definition cell below first !\n",
    "\n",
    "output in the format of a tuple of (eigen_value, eigen_vector), where eigen_value is a floating point number\n",
    "and eigen_vector is a np.array of size = dimension of the universe of stocks\n",
    "example:\n",
    "\n",
    "[(4.810366252388185, \n",
    "array([0.05538328, 0.29347463, 0.32664834, 0.2872861 , 0.29960184,\n",
    "       0.29329658, 0.27441429, 0.268705  , 0.33613716, 0.18719918,\n",
    "       0.23425907, 0.32685361, 0.29755814]))),\n",
    "       \n",
    "(0.8317740364515852, \n",
    "array([-0.15387162, -0.17651691,  0.09045863,  0.49494666, -0.12290679,\n",
    "        0.24638472, -0.08672481, -0.43141257, -0.09895669,  0.57551152,\n",
    "       -0.25734478,  0.04109247, -0.11679029])))]\n",
    "       \n",
    "would be a list of two eigen pairs\n",
    "\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "\n",
    "# define parameters for wrappers\n",
    "\n",
    "top_n = 15 # top 15 market cap tech tickers to choose from\n",
    "filename = './companylist.csv'\n",
    "pools = get_tech_tickers(filename, top_n)\n",
    "pools.remove('GOOG')\n",
    "dates = ['20150102','20170103','20170104']\n",
    "start_time = '9am'\n",
    "end_time = '4pm'\n",
    "mtype = 'T'\n",
    "group = 'directs'\n",
    "align_by_sec_interval_list = [1,5,10,20,30,60,120]\n",
    "output_pairs = False\n",
    "thre = 0.65\n",
    "\n",
    "# to use\n",
    "if __name__ == '__main__':\n",
    "    res = {}\n",
    "    for date in dates:\n",
    "        res[date] = {}\n",
    "        for align_by_sec_interval in align_by_sec_interval_list:\n",
    "            print '\\n\\n'\n",
    "            print 'pulling data on date: ', date, 'with align time interval of: ', align_by_sec_interval\n",
    "            df = get_pool_data(pools, date, group, start_time, end_time, mtype, align_by_sec_interval)\n",
    "            eig_pair = pca(df, output_pairs = output_pairs, thre = thre)\n",
    "            res[date][align_by_sec_interval] = eig_pair\n",
    "            with open('pca_res.txt','a') as f:\n",
    "                f.write(str(date) + ' ' + str(align_by_sec_interval) + ' seconds ' + \\\n",
    "                        'eigen_pairs: \\n' + str(eig_pair) + '\\n' )\n",
    "    with open('pca_res.txt','a') as f:\n",
    "        f.write('\\n\\n\\nAll of the results are: \\n\\n')\n",
    "        f.write(str(res))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  1\n",
      "Aligning by time interval: 1 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "QCOM_log_ret  TXN_log_ret    0.194869\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  5\n",
      "Aligning by time interval: 5 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "MSFT_log_ret  QCOM_log_ret    0.316346\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  10\n",
      "Aligning by time interval: 10 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "MU_log_ret  INTC_log_ret    0.405973\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  20\n",
      "Aligning by time interval: 20 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "TXN_log_ret  INTC_log_ret    0.556603\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  30\n",
      "Aligning by time interval: 30 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "TXN_log_ret  INTC_log_ret    0.607666\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  60\n",
      "Aligning by time interval: 60 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "TXN_log_ret  INTC_log_ret    0.725387\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20150102 with align time interval of:  120\n",
      "Aligning by time interval: 120 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "dataframe is empty\n",
      "optimal result for current setting is: \n",
      "\n",
      "[0, 0]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  1\n",
      "Aligning by time interval: 1 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "MSFT_log_ret  FB_log_ret    0.201638\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  5\n",
      "Aligning by time interval: 5 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "INTC_log_ret  TXN_log_ret    0.407033\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  10\n",
      "Aligning by time interval: 10 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "INTC_log_ret  TXN_log_ret    0.509607\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  20\n",
      "Aligning by time interval: 20 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "TXN_log_ret  INTC_log_ret    0.590157\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  30\n",
      "Aligning by time interval: 30 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "INTC_log_ret  TXN_log_ret    0.577877\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  60\n",
      "Aligning by time interval: 60 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "TXN_log_ret  INTC_log_ret    0.602899\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170103 with align time interval of:  120\n",
      "Aligning by time interval: 120 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "dataframe is empty\n",
      "optimal result for current setting is: \n",
      "\n",
      "[0, 0]\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  1\n",
      "Aligning by time interval: 1 seconds\n",
      "getting data from: AAPL\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "TXN_log_ret  INTC_log_ret    0.197697\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  5\n",
      "Aligning by time interval: 5 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "INTC_log_ret  QCOM_log_ret    0.366415\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  10\n",
      "Aligning by time interval: 10 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "QCOM_log_ret  INTC_log_ret    0.436315\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  20\n",
      "Aligning by time interval: 20 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "INTC_log_ret  QCOM_log_ret    0.503243\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  30\n",
      "Aligning by time interval: 30 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "QCOM_log_ret  INTC_log_ret    0.499839\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  60\n",
      "Aligning by time interval: 60 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "optimal result for current setting is: \n",
      "\n",
      "AAPL_log_ret  MSFT_log_ret    0.58059\n",
      "dtype: float64\n",
      "\n",
      "\n",
      "\n",
      "pulling data on date:  20170104 with align time interval of:  120\n",
      "Aligning by time interval: 120 seconds\n",
      "getting data from: AAPL\n",
      "getting data from: MSFT\n",
      "getting data from: GOOGL\n",
      "getting data from: FB\n",
      "getting data from: INTC\n",
      "getting data from: CSCO\n",
      "getting data from: NVDA\n",
      "getting data from: ADBE\n",
      "getting data from: TXN\n",
      "getting data from: AVGO\n",
      "getting data from: QCOM\n",
      "getting data from: MU\n",
      "getting data from: BIDU\n",
      "getting data from: AABA\n",
      "Ticker not found in the database!\n",
      "\n",
      "merge complete.\n",
      "\n",
      "dataframe is empty\n",
      "optimal result for current setting is: \n",
      "\n",
      "[0, 0]\n",
      "[0.7253865967812209, TXN_log_ret  INTC_log_ret    0.725387\n",
      "dtype: float64]\n",
      "{'20170104': {1: TXN_log_ret  INTC_log_ret    0.197697\n",
      "dtype: float64, 5: INTC_log_ret  QCOM_log_ret    0.366415\n",
      "dtype: float64, 10: QCOM_log_ret  INTC_log_ret    0.436315\n",
      "dtype: float64, 20: INTC_log_ret  QCOM_log_ret    0.503243\n",
      "dtype: float64, 120: [0, 0], 60: AAPL_log_ret  MSFT_log_ret    0.58059\n",
      "dtype: float64, 30: QCOM_log_ret  INTC_log_ret    0.499839\n",
      "dtype: float64}, '20170103': {1: MSFT_log_ret  FB_log_ret    0.201638\n",
      "dtype: float64, 5: INTC_log_ret  TXN_log_ret    0.407033\n",
      "dtype: float64, 10: INTC_log_ret  TXN_log_ret    0.509607\n",
      "dtype: float64, 20: TXN_log_ret  INTC_log_ret    0.590157\n",
      "dtype: float64, 120: [0, 0], 60: TXN_log_ret  INTC_log_ret    0.602899\n",
      "dtype: float64, 30: INTC_log_ret  TXN_log_ret    0.577877\n",
      "dtype: float64}, '20150102': {1: QCOM_log_ret  TXN_log_ret    0.194869\n",
      "dtype: float64, 5: MSFT_log_ret  QCOM_log_ret    0.316346\n",
      "dtype: float64, 10: MU_log_ret  INTC_log_ret    0.405973\n",
      "dtype: float64, 20: TXN_log_ret  INTC_log_ret    0.556603\n",
      "dtype: float64, 120: [0, 0], 60: TXN_log_ret  INTC_log_ret    0.725387\n",
      "dtype: float64, 30: TXN_log_ret  INTC_log_ret    0.607666\n",
      "dtype: float64}}\n"
     ]
    }
   ],
   "source": [
    "# this cell is for getting the most correlated pairs of stocks !\n",
    "\n",
    "# run the function definition cell below first !\n",
    "# define parameters for wrappers\n",
    "\n",
    "top_n = 15 # top 100 market cap tech tickers to choose from\n",
    "filename = './companylist.csv'\n",
    "pools = get_tech_tickers(filename, top_n)\n",
    "pools.remove('GOOG')\n",
    "dates = ['20150102','20170103','20170104']\n",
    "start_time = '9am'\n",
    "end_time = '4pm'\n",
    "mtype = 'T'\n",
    "group = 'directs'\n",
    "align_by_sec_interval_list = [1,5,10,20,30,60,120]\n",
    "output_pairs = True\n",
    "\n",
    "# to use\n",
    "if __name__ == '__main__':\n",
    "    res = {}\n",
    "    best_pair = ['0']*2 # (corr, corr_pair)\n",
    "    for date in dates:\n",
    "        res[date] = {}\n",
    "        for align_by_sec_interval in align_by_sec_interval_list:\n",
    "            print '\\n\\n'\n",
    "            print 'pulling data on date: ', date, 'with align time interval of: ', align_by_sec_interval\n",
    "            df = get_pool_data(pools, date, group, start_time, end_time, mtype, align_by_sec_interval)\n",
    "            pairs = pca(df, output_pairs = True)\n",
    "            print 'optimal result for current setting is: \\n\\n', pairs\n",
    "            res[date][align_by_sec_interval] = pairs\n",
    "            with open('pairs_res.txt','a') as f:\n",
    "                f.write(str(date) + ' ' + str(align_by_sec_interval) + ' seconds ' + str(pairs) + '\\n')\n",
    "            if float(pairs[0]) > float(best_pair[0]):\n",
    "                best_pair[0] = pairs[0]\n",
    "                best_pair[1] = pairs\n",
    "    print best_pair\n",
    "    print res\n",
    "    with open('pairs_res.txt','a') as f:\n",
    "        f.write('\\n\\n\\n best pair is ' + str(best_pair))\n",
    "        f.write('\\n\\n\\n final results are: ' + str(res))\n",
    "\n",
    "                "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# definition of all the functions used \n",
    "\n",
    "def get_ticker_data(date, group, ticker, start_time, end_time, mtype):\n",
    "    \"\"\"\n",
    "    returns data from tickquery\n",
    "    \"\"\"\n",
    "    try: \n",
    "        df = twx.tickquery(date, group, ticker, start_time, end_time, mtype)\n",
    "    except:\n",
    "        print \"Ticker not found in the database!\"\n",
    "        return None\n",
    "    return df\n",
    "    \n",
    "\n",
    "def align_time(df, align_by_sec_interval = 1):\n",
    "    \"\"\"\n",
    "    this function takes in output from the following function call:\n",
    "    \n",
    "    df = twx.tickquery('20150102', 'directs', 'aapl', '3pm', '4pm', 'T')[['price']]\n",
    "     \n",
    "    takes in a dataframe formatted as [time, price], where the time column is the index\n",
    "    returns a dataframe that aligns prices to each second interval\n",
    "    assume that the input column name is ['price']\n",
    "\n",
    "    \"\"\"\n",
    "    new_times = []\n",
    "    new_price = []\n",
    "    dates = df.index.tolist()\n",
    "    prices = df['price'].values.tolist()\n",
    "    ptr = 0\n",
    "    start_time = pd.Timestamp(df.index.values[0].astype('<M8[m]'))\n",
    "    end_time = pd.Timestamp(df.index.values[-1].astype('<M8[m]'))\n",
    "    l = pd.Timedelta(end_time - start_time).seconds/align_by_sec_interval\n",
    "#     if len(df) < l:\n",
    "#         print \"Warning ! the length of this ticker is less than length of the time interval.\\n\"\n",
    "    for idx in range(l):   \n",
    "        curr_time = start_time + pd.Timedelta(seconds=align_by_sec_interval) * idx\n",
    "        new_times.append(curr_time)\n",
    "        while ptr < len(prices) and dates[ptr] < curr_time:\n",
    "            # pointer that points to the last element before it reaches the end of that second\n",
    "            ptr += 1\n",
    "        # when it exits the while loop - dates[ptr] is now greater than or equal to curr second\n",
    "        # step back one step to make sure it is before end of current second interval \n",
    "        if ptr >= 1:\n",
    "            new_price.append(prices[ptr - 1])\n",
    "        else:\n",
    "            # ptr == 0\n",
    "            new_price.append(prices[0])\n",
    "    columns = df.columns.tolist()\n",
    "    assert len(columns) == 1\n",
    "    new_df = pd.DataFrame(index = new_times, columns = columns)\n",
    "    new_df[columns[0]] = new_price\n",
    "    return new_df\n",
    "\n",
    "\n",
    "def get_pool_data(pools, date, group, start_time, end_time, mtype, align_by_sec_interval = 1):\n",
    "    \"\"\"\n",
    "    this funtion takes in a list of tickers that we want to pull data from\n",
    "    and aligns the data using align_time function defined above so that price of each second interval\n",
    "    is extracted and aligned across different ticker\n",
    "    \n",
    "    params example:\n",
    "    pools = ['aapl', 'googl', 'msft']\n",
    "    date = '20150102'\n",
    "    start_time = '9am'\n",
    "    end_time = '4pm'\n",
    "    mtype = 'T'\n",
    "    group = 'directs'\n",
    "    \n",
    "    returns a dataframe that is the merged df of all ticker prices after proper time alignment and normalization\n",
    "    \n",
    "    returned df from this function can be fed directly into pca function to get most correlated pairs/eigenvalues\n",
    "    \"\"\"\n",
    "    d = {}\n",
    "    print \"Aligning by time interval: %d seconds\" % align_by_sec_interval\n",
    "    for idx, ticker in enumerate(pools):\n",
    "        print 'getting data from:', ticker\n",
    "        tmp = get_ticker_data(date, group, ticker, start_time, end_time, mtype)\n",
    "        if tmp is None: continue\n",
    "        tmp = tmp[['price']]\n",
    "        tmp = align_time(tmp, align_by_sec_interval)\n",
    "        # convert to log return\n",
    "        tmp['price'] = np.log(tmp.price).diff()\n",
    "        # careful that now the first entry is NAN value\n",
    "        tmp = tmp.dropna()\n",
    "        tmp = tmp.rename(columns={'price': ticker + '_log_ret'})\n",
    "        d[ticker] = tmp\n",
    "        \n",
    "        if idx == 0: \n",
    "            df = d[ticker]\n",
    "        else:\n",
    "            # merge current dataframe with existing large dataframe to df\n",
    "            df = pd.merge(d[ticker], df, left_index=True, right_index=True)\n",
    "    print \"\\nmerge complete.\\n\"\n",
    "    df=(df - df.mean())/df.std()\n",
    "    return df\n",
    "\n",
    "    \n",
    "def pca(df, output_pairs = True, thre = 0.65):\n",
    "    \"\"\"\n",
    "    thre - amount of contribution of eigenvalues to be output\n",
    "    \n",
    "    input data dimension N x D where N is number of tickers and D is sample size per ticker\n",
    "    at this point the index of datetime doesnt matter anymore since prices are already aligned \n",
    "    can simply take in price lists and compute correlation matrix and etc.\n",
    "    \n",
    "    if pairs is true, returns the pair of tickers that have the highest correlation\n",
    "    if pairs is false, returns the sorted eigenvectors and their eigenvalues\n",
    "    \n",
    "    if pairs is false - the funtion outputs the significant eigenvalues and eigenvectors\n",
    "    it outputs eigenvectors up to those that contribute to thre of significance\n",
    "    \n",
    "    \"\"\"\n",
    "    \n",
    "    m = df.as_matrix()\n",
    "    D, N = m.shape\n",
    "    if D == 0:\n",
    "        print 'dataframe is empty'\n",
    "        if output_pairs:\n",
    "            return [0,0]\n",
    "        else:\n",
    "            return 0\n",
    "    \n",
    "    df_cor = df.corr().abs()\n",
    "    flat = df_cor.unstack()\n",
    "    cor_ordered = flat.order(kind=\"quicksort\")\n",
    "    \n",
    "    if output_pairs:\n",
    "        max_cor = cor_ordered[-(N+1):-N]    \n",
    "        return max_cor\n",
    "    else:\n",
    "        cor = np.corrcoef(m.T)\n",
    "        assert cor.shape == (N,N)\n",
    "        eig_val, eig_vec = LA.eig(cor)  \n",
    "        # the column vec[:,i] is the eigenvector corresponding to the eigenvalue val[i].\n",
    "        # sort the eigenvector w.r.t its eigenvalues\n",
    "        ev_list = zip(eig_val, eig_vec.T)\n",
    "        ev_list.sort(key=lambda tup:tup[0], reverse = True)\n",
    "        eig_val, eig_vec = zip(*ev_list)\n",
    "        \n",
    "        tmp = 0.\n",
    "        idx = 0\n",
    "        while idx <= len(eig_val) and tmp/sum(eig_val) < thre:\n",
    "            tmp += eig_val[idx]\n",
    "            idx += 1\n",
    "            \n",
    "        print ev_list[:idx]\n",
    "        return ev_list[:idx]\n",
    "\n",
    "    \n",
    "def get_tech_tickers(filename = 'companylist.csv', top_n = 100):\n",
    "    \"\"\"\n",
    "    this function retrieves top 100 marketcap tech sector tickers from a csv file and returns a list of tickers\n",
    "    \"\"\"\n",
    "    l = pd.read_csv(filename)\n",
    "    tech = l[l['Sector'] == 'Technology']\n",
    "    tech = tech.sort(['MarketCap'], ascending=[0])[:top_n]\n",
    "    return tech['Symbol'].values.tolist()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f0c4b099ed0>"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0c4b59c350>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# optional - if want to visualize the aligned normalized log return from different tickers - \n",
    "# uncomment the following and run - adjust the size if needed\n",
    "\n",
    "# %matplotlib inline\n",
    "# import seaborn\n",
    "# seaborn.mpl.rcParams['figure.figsize'] = (12.0, 8.0)\n",
    "# seaborn.mpl.rcParams['savefig.dpi'] = 90\n",
    "# df.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# this cell checks if a specific date is working \n",
    "\n",
    "# date = '20170104'\n",
    "# df = twx.tickquery(date, 'directs', 'aapl', '3pm', '4pm', 'T')[['price']]\n",
    "# df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Symbol</th>\n",
       "      <th>Name</th>\n",
       "      <th>LastSale</th>\n",
       "      <th>MarketCap</th>\n",
       "      <th>ADR TSO</th>\n",
       "      <th>IPOyear</th>\n",
       "      <th>Sector</th>\n",
       "      <th>Industry</th>\n",
       "      <th>Summary Quote</th>\n",
       "      <th>Unnamed: 9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>196</th>\n",
       "      <td>AAPL</td>\n",
       "      <td>Apple Inc.</td>\n",
       "      <td>188.36</td>\n",
       "      <td>9.258154e+11</td>\n",
       "      <td>n/a</td>\n",
       "      <td>1980</td>\n",
       "      <td>Technology</td>\n",
       "      <td>Computer Manufacturing</td>\n",
       "      <td>https://www.nasdaq.com/symbol/aapl</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1984</th>\n",
       "      <td>MSFT</td>\n",
       "      <td>Microsoft Corporation</td>\n",
       "      <td>98.66</td>\n",
       "      <td>7.580243e+11</td>\n",
       "      <td>n/a</td>\n",
       "      <td>1986</td>\n",
       "      <td>Technology</td>\n",
       "      <td>Computer Software: Prepackaged Software</td>\n",
       "      <td>https://www.nasdaq.com/symbol/msft</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>123</th>\n",
       "      <td>GOOGL</td>\n",
       "      <td>Alphabet Inc.</td>\n",
       "      <td>1086.23</td>\n",
       "      <td>7.544397e+11</td>\n",
       "      <td>n/a</td>\n",
       "      <td>n/a</td>\n",
       "      <td>Technology</td>\n",
       "      <td>Computer Software: Programming, Data Processing</td>\n",
       "      <td>https://www.nasdaq.com/symbol/googl</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>GOOG</td>\n",
       "      <td>Alphabet Inc.</td>\n",
       "      <td>1079.68</td>\n",
       "      <td>7.498904e+11</td>\n",
       "      <td>n/a</td>\n",
       "      <td>2004</td>\n",
       "      <td>Technology</td>\n",
       "      <td>Computer Software: Programming, Data Processing</td>\n",
       "      <td>https://www.nasdaq.com/symbol/goog</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1027</th>\n",
       "      <td>FB</td>\n",
       "      <td>Facebook, Inc.</td>\n",
       "      <td>186.9</td>\n",
       "      <td>5.410059e+11</td>\n",
       "      <td>n/a</td>\n",
       "      <td>2012</td>\n",
       "      <td>Technology</td>\n",
       "      <td>Computer Software: Programming, Data Processing</td>\n",
       "      <td>https://www.nasdaq.com/symbol/fb</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Symbol                   Name LastSale     MarketCap ADR TSO IPOyear  \\\n",
       "196    AAPL             Apple Inc.   188.36  9.258154e+11     n/a    1980   \n",
       "1984   MSFT  Microsoft Corporation    98.66  7.580243e+11     n/a    1986   \n",
       "123   GOOGL          Alphabet Inc.  1086.23  7.544397e+11     n/a     n/a   \n",
       "122    GOOG          Alphabet Inc.  1079.68  7.498904e+11     n/a    2004   \n",
       "1027     FB         Facebook, Inc.    186.9  5.410059e+11     n/a    2012   \n",
       "\n",
       "          Sector                                         Industry  \\\n",
       "196   Technology                           Computer Manufacturing   \n",
       "1984  Technology          Computer Software: Prepackaged Software   \n",
       "123   Technology  Computer Software: Programming, Data Processing   \n",
       "122   Technology  Computer Software: Programming, Data Processing   \n",
       "1027  Technology  Computer Software: Programming, Data Processing   \n",
       "\n",
       "                            Summary Quote  Unnamed: 9  \n",
       "196    https://www.nasdaq.com/symbol/aapl         NaN  \n",
       "1984   https://www.nasdaq.com/symbol/msft         NaN  \n",
       "123   https://www.nasdaq.com/symbol/googl         NaN  \n",
       "122    https://www.nasdaq.com/symbol/goog         NaN  \n",
       "1027     https://www.nasdaq.com/symbol/fb         NaN  "
      ]
     },
     "execution_count": 252,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# this cell shows the head of the companylist.csv file that is sorted by market cap\n",
    "\n",
    "l = pd.read_csv('./companylist.csv')\n",
    "tech = l[l['Sector'] == 'Technology']\n",
    "tech = tech.sort(['MarketCap'], ascending=[0])[:100]\n",
    "# print 'retrived a total of %d tech tickers ' %len(tech_tickers)\n",
    "tech.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
